package cn.jy.boot.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import cn.jy.boot.pojo.User;
import cn.jy.boot.service.UserService;
import cn.jy.boot.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

/**
* @author Ag
* @description 针对表【t_user】的数据库操作Service实现
* @createDate 2022-04-21 21:52:24
*/
@CacheConfig(cacheNames = "user")
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService{

    @Autowired
    private UserMapper userMapper;

    /*@Cacheable 作用 首先会查询缓存 如果有相应的缓存就直接返回
    没有就执行方法 并且把方法的返回值 存入缓存 供下次使用
    * key 取得是方法的参数的名称
    * keyGenerator 和 key 2选1
    * value 取得是方法的返回值
    * cacheManager 存在多个缓存实现时，指定将缓存存入那个缓存管理器
    * cacheResolver 和 cacheManager的作用一样 2选1
    * condition 条件成立时 结果才会被缓存
    * unless 条件成立时 不缓存
    * sync 是否异步 默认值是false 如果指定了true 则unless将不会被支持
    * @param id
    * @return
    * */
    @Cacheable(/*cacheNames = {"user"},*/key = "#root.args[1]",condition = "#id<5"/*,unless = "#id==1"*/,sync = true)
    @Override
    public User getUserById(Object o, Integer id) {
        System.out.println("执行了一次用户查询。。。。。");
        User user = userMapper.selectById(id);
        return user;
    }

    @CachePut(/*cacheNames = {"user"},*/key = "#user.uid")
    @Override
    public User updateUserById(User user) {
        System.out.println("用户id为"+user.getUid()+"更新了");
        userMapper.updateUser(user);
        return user;
    }

    @CacheEvict(/*cacheNames = {"user"},*/key = "#id",beforeInvocation = false)
    @Override
    public int delUser(Integer id) {
        System.out.println("删除了一个用户");
        userMapper.deleteById(id);
        return 0;
    }
}




